#!/bin/bash

# 停止ChunkServer进程脚本

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 默认端口
DEFAULT_PORT=50051

# 显示使用说明
show_usage() {
    echo -e "${BLUE}=== 停止ChunkServer进程 ===${NC}"
    echo ""
    echo "用法: $0 [端口号]"
    echo ""
    echo "参数:"
    echo "  端口号    指定要停止的ChunkServer端口 (默认: $DEFAULT_PORT)"
    echo ""
    echo "示例:"
    echo "  $0              # 停止默认端口的ChunkServer"
    echo "  $0 50052        # 停止端口 50052 的ChunkServer"
    echo "  $0 50053        # 停止端口 50053 的ChunkServer"
    echo ""
}

# 检查参数
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
    show_usage
    exit 0
fi

# 设置端口
PORT=${1:-$DEFAULT_PORT}

echo -e "${BLUE}=== 停止ChunkServer进程 (端口: $PORT) ===${NC}"

# 获取脚本所在目录
SCRIPT_DIR=$(cd $(dirname $0); pwd)
LOG_DIR="$SCRIPT_DIR/logs"
PID_FILE="$LOG_DIR/chunkserver_$PORT.pid"

# 查找指定端口的chunkserver进程（使用多种方法）
echo -e "${BLUE}查找端口 $PORT 的ChunkServer进程...${NC}"

# 方法1: 使用pgrep查找
CHUNKSERVER_PIDS=$(pgrep -f "chunkserver_server.*--port $PORT" 2>/dev/null)

# 方法2: 使用ps查找（备用方法）
if [ -z "$CHUNKSERVER_PIDS" ]; then
    CHUNKSERVER_PIDS=$(ps aux | grep "chunkserver_server.*--port $PORT" | grep -v grep | awk '{print $2}' 2>/dev/null)
fi

# 方法3: 使用lsof查找占用端口的进程
if [ -z "$CHUNKSERVER_PIDS" ]; then
    PORT_PIDS=$(lsof -ti :$PORT 2>/dev/null)
    if [ ! -z "$PORT_PIDS" ]; then
        CHUNKSERVER_PIDS="$PORT_PIDS"
    fi
fi

# 去重和清理
if [ ! -z "$CHUNKSERVER_PIDS" ]; then
    CHUNKSERVER_PIDS=$(echo $CHUNKSERVER_PIDS | tr ' ' '\n' | sort -u | tr '\n' ' ')
fi

if [ -z "$CHUNKSERVER_PIDS" ]; then
    echo -e "${GREEN}没有找到端口 $PORT 的ChunkServer进程${NC}"
    
    # 即使没有找到进程，也清理PID文件
    if [ -f "$PID_FILE" ]; then
        rm -f "$PID_FILE"
        echo -e "${BLUE}PID文件已清理${NC}"
    fi
    exit 0
fi

echo -e "${YELLOW}找到端口 $PORT 的以下ChunkServer进程:${NC}"
for pid in $CHUNKSERVER_PIDS; do
    echo "  - PID: $pid"
    # 显示进程详细信息
    ps -p $pid -o pid,ppid,cmd --no-headers 2>/dev/null | while read line; do
        echo "    详情: $line"
    done
done
echo ""

# 询问用户确认
read -p "是否停止端口 $PORT 的所有ChunkServer进程? (y/N): " -n 1 -r
echo ""
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
    echo -e "${YELLOW}操作已取消${NC}"
    exit 0
fi

# 停止进程
STOPPED_COUNT=0
FAILED_PIDS=()

for pid in $CHUNKSERVER_PIDS; do
    echo -e "${BLUE}停止进程 $pid (端口: $PORT)...${NC}"
    
    # 检查进程是否仍然存在
    if ! kill -0 $pid 2>/dev/null; then
        echo -e "${YELLOW}进程 $pid 已不存在，跳过${NC}"
        continue
    fi
    
    # 尝试优雅停止
    kill $pid
    
    # 等待进程结束
    for i in {1..15}; do
        if ! kill -0 $pid 2>/dev/null; then
            echo -e "${GREEN}✓ 进程 $pid 已停止${NC}"
            STOPPED_COUNT=$((STOPPED_COUNT + 1))
            break
        fi
        sleep 1
    done
    
    # 如果进程仍然存在，强制杀死
    if kill -0 $pid 2>/dev/null; then
        echo -e "${YELLOW}进程 $pid 未响应，强制停止...${NC}"
        kill -9 $pid
        
        # 再次等待
        for i in {1..5}; do
            if ! kill -0 $pid 2>/dev/null; then
                echo -e "${GREEN}✓ 进程 $pid 已强制停止${NC}"
                STOPPED_COUNT=$((STOPPED_COUNT + 1))
                break
            fi
            sleep 1
        done
        
        # 最终检查
        if kill -0 $pid 2>/dev/null; then
            echo -e "${RED}✗ 进程 $pid 停止失败${NC}"
            FAILED_PIDS+=($pid)
        fi
    fi
done

# 清理PID文件
echo -e "${BLUE}清理PID文件...${NC}"
if [ -f "$PID_FILE" ]; then
    PID=$(cat "$PID_FILE" 2>/dev/null)
    if [ ! -z "$PID" ] && kill -0 $PID 2>/dev/null; then
        echo -e "${YELLOW}强制停止PID文件中的进程: $PID${NC}"
        kill -9 $PID 2>/dev/null
    fi
    rm -f "$PID_FILE"
    echo -e "${BLUE}PID文件已删除${NC}"
fi

# 最终清理 - 使用多种方法
echo -e "${BLUE}最终清理...${NC}"

# 方法1: 使用pkill
REMAINING_PIDS=$(pgrep -f "chunkserver_server.*--port $PORT" 2>/dev/null)
if [ ! -z "$REMAINING_PIDS" ]; then
    echo -e "${YELLOW}使用pkill清理端口 $PORT 的残留进程: $REMAINING_PIDS${NC}"
    pkill -f "chunkserver_server.*--port $PORT" 2>/dev/null
    sleep 2
fi

# 方法2: 使用killall
if command -v killall &> /dev/null; then
    killall chunkserver_server 2>/dev/null
    echo -e "${BLUE}使用killall清理...${NC}"
fi

# 方法3: 清理占用端口的进程
PORT_PIDS=$(lsof -ti :$PORT 2>/dev/null)
if [ ! -z "$PORT_PIDS" ]; then
    echo -e "${YELLOW}清理端口 $PORT 的进程: $PORT_PIDS${NC}"
    kill -9 $PORT_PIDS 2>/dev/null
fi

# 最终检查
FINAL_REMAINING=$(pgrep -f "chunkserver_server.*--port $PORT" 2>/dev/null)
if [ ! -z "$FINAL_REMAINING" ]; then
    echo -e "${RED}警告: 端口 $PORT 仍有残留进程: $FINAL_REMAINING${NC}"
    echo -e "${YELLOW}请手动检查这些进程${NC}"
else
    echo -e "${GREEN}✓ 端口 $PORT 的所有ChunkServer进程已清理完成${NC}"
fi

echo ""
echo -e "${BLUE}=== 停止结果 ===${NC}"
echo -e "${GREEN}成功停止: $STOPPED_COUNT 个ChunkServer进程${NC}"

if [ ${#FAILED_PIDS[@]} -gt 0 ]; then
    echo -e "${RED}停止失败: ${#FAILED_PIDS[@]} 个进程${NC}"
    for pid in "${FAILED_PIDS[@]}"; do
        echo "  - PID: $pid"
    done
fi

echo ""
echo -e "${GREEN}ChunkServer (端口: $PORT) 停止完成！${NC}" 